package com.mokairui.basic.interrupt;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.util.Currency;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;

/**
 * @author Mokairui
 * @Description LockSupport.park() 方法的使用
 *                  打断线程，它内部是根据打断标记来决定的如果打断标记为true那么这个方法等于失效，
 *                  会放行下面的代码
 * @Since 2021/6/6
 */
@Slf4j(topic = "c.LockSupportPark")
public class LockSupportParkDemo {
    public static void main(String[] args) {
//        test();
        test2();
    }

    /**
     * 执行结果：只会打印 park... LockSupport.park() 方法会将线程打断
     */
    @SneakyThrows
    private static void test() {
        Thread thread = new Thread(() -> {
            log.debug("park...");
            LockSupport.park();
            log.debug("unpark...");
        });
        thread.start();
    }

    /**
     * 执行结果：
     *      会全部打印，整个线程不会中断，因为在睡眠两秒之后interrupt()方法把该线程的
     *    打断标记置为了true，park() 方法就失效了，50行查看打断状态可以使用静态的 Thread.interrupted()
     *    方法查看打断标记，这个方法在查看之后会将打断标记重新清空为false，这样下面的park方法就又可以生效了
     */
    @SneakyThrows
    private static void test2() {
        Thread thread = new Thread(() -> {
            log.debug("park...");
            LockSupport.park();
            log.debug("unpark...");
            log.debug("打断状态：{}", Thread.currentThread().isInterrupted());
            LockSupport.park();
            log.debug("unpark...");
        });
        thread.start();

        TimeUnit.SECONDS.sleep(2);
        thread.interrupt();
    }
}
